//
// Created by xinrong.qian on 2025/4/15.
//

#include "../IGrayScaleProcessor.hpp"
#include "rectangle_info.hpp"
#include "tc_response_info.hpp"
#include "CTLineResult.h"

class CardProcessor : public IGrayScaleProcessor {
public:

    // rpc返回结果封装
    virtual std::tuple<std::string,std::string,std::vector<double>, int, int, double, double, double>
    GetGrayScaleArray(const cv::Mat &image, int x, int y, int width,
                      int height) override;

    // 矫正图像，并裁剪黑边
    cv::Mat correctAndCropWhiteRectangle(const cv::Mat &input);
    // channel和ct线边框显示
    void ShowMat(cv::Mat& image, const std::vector<RectangleInfo>& rectangles);

    // 绘制折线图
    void drawCurve(const std::vector<double>& data);

    // 显示图像
    void showImage(const cv::Mat& image);

    // 寻找 c t 线以及中点位置
    std::tuple<int, int, int>
    FindPeakPoints(const std::vector<double> &grayValues);

    // 声明扫描图像均值计算
    std::vector<double>meanRoundRectangle(const cv::Mat &imgGray, int R);

    // 截取复制曲线数据
    std::vector<double> crop(const std::vector<double> &data, int start, int end);

    // 曲线内找最小值
    cv::Point2d minPoint2d(const std::vector<double> &average);


    // 计算给定数据向量 data 在指定区间内的定积分
    double getDefiniteIntegral(const std::vector<double> &data, cv::Point2d local, int hwf = 4);

    // 计算 tc阴阳性结果
    std::string calculateTcResult(double tcRatio);

    // 预处理图像
    cv::Mat preprocessImage(const cv::Mat& src);

    /********************************************************/
    // 请求返回函数
    TcResponseInfo GetTcResponseInfo(const cv::Mat &image,
                                     int x, int y, int width, int height);

    // 计算tc函数
    CTLineResult CalculateTc(const cv::Mat &image);

};